﻿#ifndef FD_CORE_FILE_H
#define FD_CORE_FILE_H
#pragma once

#include "kernel/OgrePlatform.h"
#include "kernel/fileengine_def.h"
#include "kernel/string_def.h"

namespace FD
{
	namespace Kernel
	{
		struct FileHandle;
		class FD_Kernel_Export File  :  public FD::Kernel::CReferenced
		{
		public:
			File();
			~File();
		public:
			/*
			* 函数功能： 打开/创建文件
			* 参    数：
			*  const String &strFileName [in] ：文件名（路径+名称）
			*  const FD::Kernel::FILEMODE &eMode [in] ：打开模式
			* 返 回 值：true打开成功，false打开失败
			* 作者：
			* 日期：2012.2.13
			*/
			bool open(const String &strFileName, const FD::Kernel::FILEMODE &eMode = READ_MODE);
			/*
			* 函数功能： 判断文件是否打开
			* 参    数：
			* 返 回 值：true已经打开，false没有打开
			* 作者：
			* 日期：2012.2.13
			*/
			bool isOpen();
			/*
			* 函数功能： 关闭文件
			* 参    数：
			* 作者：
			* 日期：2012.2.13
			*/
			void close();
			/*
			* 函数功能： 以文本方式读取文件的一行
			* 参    数：
			*  String &strLine [out] ：文件的一行
			* 返 回 值：返回真正读取的字节数，失败或文件末尾返回0
			* 作者：
			* 日期：2012.2.13
			*/
			UINT64 readLine( String &strLine);
			/*
			* 函数功能： 以文本方式写文件的一行
			* 参    数：
			* const String &strLine [in] ：文件的一行
			* 返 回 值：返回真正写了多少字节，返回0表示失败
			* 作者：
			* 日期：2012.2.13
			*/
			UINT64 writeLine(const String &strLine);
			/*
			* 函数功能： 以二进制方式读文件
			* 参    数：
			* BYTE *buf [out] ：二进制字节
			* UINT64 [in] ：字节数
			* 返 回 值：返回真正读了多少字节,返回0表示有可能到达末尾，有可能失败
			* 作者：
			* 日期：2012.2.13
			*/
			UINT64 read(BYTE *buf, UINT64 nNum);
			/*
			* 函数功能： 以二进制方式写文件
			* 参    数：
			* BYTE *buf [in] ：二进制字节
			* UINT64 [in] ：字节数
			* 返 回 值：返回真正写了多少字节，返回0表示失败
			* 作者：
			* 日期：2012.2.13
			*/
			UINT64 write(BYTE *buf, UINT64 nNum);
			/*
			* 函数功能： 判断是否到达文件末尾
			* 参    数：
			* 返 回 值：TRUE已到达末尾，FALSE未到达末尾
			* 作者：
			* 日期：2012.2.13
			*/
			bool eof();
			/*
			* 函数功能： 移动文件指针
			* 参    数：
			UINT64 nPosOff [in] : 文件指针的偏移步数
			const FD::Kernel::FILEWAY &way [in] ：文件指针偏移的方向
			* 返 回 值：返回当前指针位置,如果为0且有错误码表示失败
			* 作者：
			* 日期：2012.2.13
			*/
			UINT64 seek(UINT64 nPosOff, const FD::Kernel::FILEWAY &way);
			/*
			* 函数功能： 保存文件
			* 参    数：
			* 返 回 值：true保存文件成功，false保存文件失败
			* 作者：
			* 日期：2012.2.13
			*/
			bool save();
			/*
			* 函数功能： 文件重命名
			* 参    数：
			const String &strFileName [in] : 文件名（路径+名称）
			const String &strNwName [in] ：新的文件名称，不包括后缀
			* 返 回 值：TRUE成功,FALSE失败
			* 作者：
			* 日期：2012.2.13
			*/
			static bool rename(const String &strFileName, const String &strNwName);
			/*
			* 函数功能： 拷贝文件
			* 参    数：
			const String &strSrcFileName [in] : 源文件名（路径+名称）
			const String &strDstFileName [in] ：目标文件夹
			bool bOverWrite [in] ：如果存在是否覆盖
			* 返 回 值：TRUE成功,FALSE失败
			* 作者：
			* 日期：2012.2.13
			*/
			static bool copy(const String &strSrcFileName, const String &strDstFolder, bool bOverWrite = false);
			/*
			* 函数功能： 移动文件
			* 参    数：
			const String &strSrcFileName [in] : 源文件名（路径+名称）
			const String &strDstFileName [in] ：目标文件夹
			bool bOverWrite [in] ：如果存在是否覆盖
			* 返 回 值：TRUE成功,FALSE失败
			* 作者：
			* 日期：2012.2.13
			*/
			static bool move(const String &strSrcFileName, const String &strDstFolder, bool bOverWrite = false);
			/*
			* 函数功能： 删除文件
			* 参    数：
			const String &strFileName [in] : 源文件名（路径+名称）
			* 返 回 值：TRUE成功,FALSE失败
			* 作者：
			* 日期：2012.2.13
			*/
			static bool remove(const String &strFileName);
			/*
			* 函数功能： 判断文件是否存在
			* 参    数：
			const String &strFileName [in] : 源文件名（路径+名称）
			* 返 回 值：TRUE存在,FALSE不存在
			* 作者：
			* 日期：2012.2.13
			*/
			static bool exists(const String &strFileName);
			/*
			* 函数功能： 获取文件长度
			* 参    数：
			const String &strFileName [in] : 源文件名（路径+名称）
			* 返 回 值：文件长度，返回0且有错误码表示失败
			* 作者：
			* 日期：2012.2.13
			*/
			static UINT64 getSize(const String &strFileName);
			/*
			* 函数功能： 获取文件属性
			* 参    数：
			FD::Kernel::FileAttributes &attrs [out] : 文件属性结构 包括时间、是否只读、是否隐藏等
			const String &strFileName[in]:  源文件名（路径+名称）
			* 返 回 值：TRUE成功，FALSE失败
			* 作者：
			* 日期：2012.2.13 日期  2012.2.16修改：增加参数strFileName

			*/
			static bool getAttributes(const String &strFileName,  FD::Kernel::FileAttributes &attrs);


			/// <summary>
			/// 判断给定的字符串是不是一个绝对文件路径
			/// </summary>
			/// <param name=""></param>
			/// <returns></returns>
			static bool isAbsoluteFile(const String& filepath);

		private:
			FileHandle *m_ptHandle;
		};
	}
}

#endif

